package com.keepmoving.service.impl;

import com.keepmoving.dao.CommitDao;
import com.keepmoving.dao.CourseDao;
import com.keepmoving.dao.UserDao;
import com.keepmoving.po.Commit;
import com.keepmoving.po.User;
import com.keepmoving.service.CommitService;
import com.keepmoving.vo.CommitBO;
import com.keepmoving.vo.CommitUserBO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.List;

/**
 * @author 魏范彬
 * 评论的业务逻辑实现类
 */
@Service
public class CommitServiceImpl implements CommitService {
    //注入数据访问层
    @Resource
    CommitDao commitDao;

    @Resource
    UserDao userDao;

    @Resource
    CourseDao courseDao;

    @Override
    public List<Commit> findAll() {
        return commitDao.findAll();
    }

    @Override
    public List<Commit> findBylId(int lId) {
        return commitDao.findBylId(lId);
    }

    @Override
    public Commit findBylIdPo(int lId) {
        return commitDao.findBylIdPo(lId);
    }

    @Override
    public Commit findById(int id) {
        return commitDao.findById(id);
    }

    @Override
    public List<Commit> findBycId(int cId) {
        return commitDao.findBycId(cId);
    }

    @Override
    public boolean insert(Commit commit) {
        commit.setCreateDate(new Timestamp(System.currentTimeMillis()));
        return commitDao.insert(commit)>0?true:false;
    }

    @Override
    public boolean delete(int id) {
        return commitDao.delete(id)>0?true:false;
    }

    @Override
    public boolean update(Commit commit) {
        return commitDao.update(commit)>0?true:false;
    }

    /**
     * 根据评论的id查询用户信息
     * @param id
     * @return 评论信息，携带用户信息
     */
    @Override
    public CommitUserBO findByIdBO(int id) {
        Commit commit=commitDao.findById(id);
        User user=userDao.findById(commit.getlId());
        CommitUserBO commitUserBO=new CommitUserBO();
        commitUserBO.setUser(user);
        commitUserBO.setCommit(commit);
        return commitUserBO;
    }

    /**
     * 根据课程的cid，查询出此课程的所有评论
     * @param cId
     * @return 课程的评论
     */
    @Override
    public List<CommitBO> findBycIdBo(int cId,CommitBO commitBO) {
        System.out.println(commitBO);
        //所有未处理的一级评论集合
        List<CommitBO> commitBOListFirst=commitDao.findBycIdFirst(cId);
        System.out.println(commitBOListFirst);
        //所有未处理的二级评论集合
        List<CommitBO> commitBOListSecond=commitDao.findBycIdSecond(cId);
        System.out.println(commitBOListSecond);

        boolean flag=addNode(commitBOListFirst,commitBO);
        System.out.println(flag);
        if(flag){
            System.out.println(cId);
            //将二级评论用链表的方式添加到一级评论
            List<CommitBO> list=addAllNode(commitBOListFirst,commitBOListSecond);
            System.out.println(cId);
            //控制台打印评论回复
            show(list);

            return list;
        }else {
            return commitBOListFirst;
        }
    }

    /**
     * 将单个node添加到链表中
     * @param firstList 第一层评论集合（链表）
     * @param commitBO 非第一层评论的回复信息
     * @return
     */
    private boolean addNode(List<CommitBO> firstList,CommitBO commitBO){
        //循环添加
        for(CommitBO node:firstList){
            //判断留言的上一段是否是这条留言（判断这条回复，是否是当前评论的回复）
            if(node.getoId()==commitBO.getLastId()){
                //是，添加，返回true
                node.getCommitBO().add(commitBO);
                return true;
            }else{
                //否则递归继续判断
                if(node.getCommitBO().size()!=0){
                    if(addNode(node.getCommitBO(),commitBO)){
                        return true;
                    }
                }
            }
        }
        return false;
    }


    /**
     * 将查出来的lastId不为null的回复都添加到第一层Node集合汇总
     * @param firstList 第一层评论集合（链表）
     * @param secondList 非第一层的评论集合（链表）
     * @return 所有的集合评论（非第一层的集合评论赌赢添加到第一层的评论集合，返回）
     */
    private List<CommitBO> addAllNode(List<CommitBO> firstList,List<CommitBO> secondList){
        while(secondList.size()!=0){
            int size=secondList.size();
            for(int i=0;i<size;i++){
                if(addNode(firstList,new CommitBO(secondList.get(i)))){
                    secondList.remove(i);
                    i--;
                    size--;
                }
            }
        }
        return firstList;
    }

    /**
     * 抖音评论的链表回复信息
     * @param list
     */
    private void show(List<CommitBO> list){
        for(CommitBO node:list){
            System.out.println(node.getlId()+"用户回复了"+node.getLastId()+":"+node.getcSummary());
            //递归打印回复信息
            if(node .getCommitBO().size()!=0){
                show(node.getCommitBO());
            }
        }
    }

}
